package cn.itsource.stream.copyfile;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

import cn.itsource.util.IoUtil;

/**
 *	IO流：
 *		分类：
 *					输入流			 		输出流
			字节流	InputStream（抽象类）     	OutputStream（抽象类）
			字符流	Reader （抽象类）       	 	Writer（抽象类）
			
	字节流：
 *		使用场景：
 *		1.字节流处理除了文本、文字相关所有的流问题，如，png/jpg/avi/map4/mp3/exe
 *		2.字符流只处理文本、文字相关
 *
 *		1.输入流	abstract class InputStream:这个抽象类是表示输入字节流的所有类的超类。
 *								|
 *							FileInputStream 子类
 *								1. 构造方法
 *										FileInputStream(String name) 	name：表示(绝对路径、相对路径)文件名
 *										FileInputStream(File file) 
 *
 *								2. 普通方法：
									//1. int read(byte[] b) 从输入流读取一些字节数，并将它们存储到缓冲区 b 。  最常用
 *									//2. int read() 从输入流读取数据的下一个字节。  
									//3. int read(byte[] b, int off, int len) 	从输入流读取最多 len字节的数据到一个字节数组。	
									
									
 *		2.输出流	abstract class OutputStream:这个抽象类是表示输出字节流的所有类的超类。
 *								|
 *							FileOutputStream 子类
 *								1. 构造方法
										FileOutputStream(String name) 
										FileOutputStream(String name, boolean append) 
										append：表示是否在该文件末尾追加数据，如果为true，表示追加，false，表示从头开始覆盖
 *										FileOutputStream(File file) 
										FileOutputStream(File file, boolean append) 
 *								
 *								2. 普通方法：
 *									//1. void write(byte[] b)将 b.length个字节从指定的字节数组写入此文件输出流。  
									//2. void write(byte[] b, int off, int len) 	将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。  最常用
									//3. void write(int b) 将指定的字节写入此文件输出流。  
		3. 注意事项：
				1. 必须要关闭IO流，节约资源开销
				2. 关闭IO流原则，先开后关
 */
public class FileUtil {

	public static void main(String[] args) {
		//调用方法测试
		copyFile("inputsteam.txt", "copyFile.txt");
		//调用方法测试
		copyFile("test.jfif", "copyFile.jfif");
		
	}
	/**
	 * 设计一个方法，复制一个文件
	 * @param srcFileName	原文件名
	 * @param destFileName  新文件名
	 */
	public static void copyFile(String srcFileName,String destFileName) {
		if (srcFileName == null || destFileName == null) {
			throw new IllegalArgumentException("文件名不能为null");
		}
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream(srcFileName);
			fos = new FileOutputStream(destFileName);
			
			//复制文件，应该一边读取，一边直接写出
			byte[] b = new byte[1024];//1kb	每次读取的数据装到该byte数组
			int read = -1;//每一次真正读取的字节个数
			while ((read = fis.read(b)) != -1) {
				//将读取byte数组中的数据，写出去。读了多少个字节就写出多少个字节
				fos.write(b, 0, read);
			}
			System.out.println("复制成功！");
		} catch (FileNotFoundException e) {
			System.out.println("文件未找到！");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("复制失败！");
			e.printStackTrace();
		} finally {
			//必须是先开后关，为了保证关流成功性，将后面关闭的流写在前面关流的finally中且，前面关流先try再if判断是否非null
			//因为关流是每一个流操作必须的，所有将关流抽取为一个方法
			IoUtil.closeIo(fis, fos);
		}
	}

}
